package com.keitaitoys.fonteditor.core;

import java.io.File;
import java.util.ArrayList;

import com.keitaitoys.fonteditor.FontEditor;
import com.keitaitoys.plugin.BasicPluginService;
import com.keitaitoys.plugin.Plugin;
import com.keitaitoys.plugin.PluginService;
import com.keitaitoys.util.ClassUtils;

public class PluginManager {

	//////////////////////////////////////////////////////////////////////
	// Description ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	// Consts ////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public static final String PLUGIN_DIRECTORY = "plugin";
	
	//////////////////////////////////////////////////////////////////////
	// Variables /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private static PluginManager manager;

	private PluginService pluginService;
	
	//////////////////////////////////////////////////////////////////////
	// Constructor ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private PluginManager() {
		
		init();
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////
	
	private void init() {
		
		try {
			
			PropertiesManager propertiesManager = PropertiesManager.getInstance();
			String pluginDirectory = propertiesManager.getProperty("plugin.directory", PLUGIN_DIRECTORY);

			ClassUtils.addClassPathFile(new File(pluginDirectory));

		} catch(Exception ignore) {}
		
		pluginService = BasicPluginService.getInstance();

		if(FontEditor.DEBUG) {
			
			ArrayList<Plugin> plugins = pluginService.getPlugins();
			
			for(Plugin plugin : plugins) {
				System.out.println("plugin found -> " + plugin.getName());
			}
			
			System.out.println("Total plugin(s) found: " + plugins.size());
			System.out.println();
		}
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////
	
	public static synchronized PluginManager getInstance() {
		
		if(manager == null) {
			manager = new PluginManager();
		}
		
		return manager;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////
	
	public ArrayList<Plugin> getPlugins() {
		
		return pluginService.getPlugins();
	}

	//////////////////////////////////////////////////////////////////////
	// Functions ///////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////
	
	public <T extends Plugin> ArrayList<T> getPlugin(Class<T> pluginClass) {
		
		return pluginService.getPlugins(pluginClass);
	}
}